package cn.lg.soar.mvc.annotations;

import cn.lg.soar.common.enums.LogTypeEnum;
import cn.lg.soar.mvc.enums.LogArgsModeEnum;
import cn.lg.soar.mvc.enums.LogErrorModeEnum;
import cn.lg.soar.mvc.enums.LogResultModeEnum;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author luguoxiang
 * @date 2021/9/28
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {

    /**
     * 日志名称（什么操作）
     */
    String value();

    /**
     * 内容，支持el表达式，el结果是字符串则保存字符串，是object的保存json数据
     */
    String content() default "";

    /**
     * 日志类型
     */
    LogTypeEnum type() default LogTypeEnum.OTHER;

    /**
     * 入参记录模式（保存哪些参数数据）
     */
    LogArgsModeEnum argsMode() default LogArgsModeEnum.args;

    /**
     * 入参el表达式，argsMode = LogResultModeEnum.el 时有效
     */
    String argsEl() default "";

    /**
     * 入参索引，argsMode = LogResultModeEnum.index 时有效
     */
    int argsIndex() default 0;

    /**
     * 出参记录模式（保存哪些参数数据）
     */
    LogResultModeEnum resultMode() default LogResultModeEnum.raw;

    /**
     * 出参el表达式，resultMode = LogResultModeEnum.el 时有效
     * 获取结果对象的某个属性：resultEl="属性名"，例如 resultEl="data"
     */
    String resultEl() default "";

    /**
     * 错误记录记录模式（若 errorMode = LogErrorModeEnum.not，则出现异常不记录日志）
     */
    LogErrorModeEnum errorMode() default LogErrorModeEnum.stack;

}
